 1.HBase读数据流程
   
   HBase读操作
   1).首先从zk找到meta表的region位置，然后读取meta表中的数据，meta表中存储了用户表的
region信息
   2).根据要查询的namespace、表名和rowkey信息。找到写入数据对应的region信息
   3).找到这个region对应的regionServer，然后发送请求
   4).查找对应的region
   5).先从memstore查找数据，如果没有，再从BlockCache上读取
   HBase上Regionserver的内存分为两个部分
   一部分作为Memstore，主要用来写；
   另外一部分作为BlockCache，主要用于读数据；
   6).如果BlockCache中也没有找到，再到StoreFile上进行读取
   从storeFile中读取到数据之后，不是直接把结果数据返回给客户端，
而是把数据先写入到BlockCache中，目的是为了加快后续的查询；然后在返回结果给客户端。
 
 2.HBase写数据流程
   
   HBase写操作
   1).首先从zk找到meta表的region位置，然后读取meta表中的数据，meta表中存储了用户表的
region信息
   2).根据namespace、表名和rowkey信息。找到写入数据对应的region信息
   3).找到这个region对应的regionServer，然后发送请求
   4).把数据分别写到HLog（write ahead log）和memstore各一份
   5).memstore达到阈值后把数据刷到磁盘，生成storeFile文件
   6).删除HLog中的历史数据
 
 3.HBase的flush(刷写)及compact(合并)机制
   
   Flush机制
   1).当memstore的大小超过这个值的时候，会flush到磁盘,默认为128M
   <property>
       <name>hbase.hregion.memstore.flush.size</name>
       <value>134217728</value>
   </property>
   2).当memstore中的数据时间超过1小时，会flush到磁盘
   <property>
       <name>hbase.regionserver.optionalcacheflushinterval</name>
       <value>3600000</value>
   </property>
   3).HregionServer的全局memstore的大小，超过该大小会触发flush到磁盘的操作,默认是堆大
小的40%
   <property>
       <name>hbase.regionserver.global.memstore.size</name>
       <value>0.4</value>
   </property>
   4).手动flush
   flush tableName
   
   阻塞机制
   以上介绍的是Store中memstore数据刷写磁盘的标准，但是Hbase中是周期性的检查是否满足以上标准
满足则进行刷写，但是如果在下次检查到来之前，数据疯狂写入Memstore中，会出现什么问题呢？
   会触发阻塞机制，此时无法写入数据到Memstore，数据无法写入Hbase集群。
   1).memstore中数据达到512MB
   计算公式：hbase.hregion.memstore.flush.size*hbase.hregion.memstore..block.multiplier
   hbase.hregion.memstore.flush.size刷写的阀值，默认是134217728,即128 MB。
   hbase.hregion.memstore.block.multiplier是一个倍数，默认 是4。
   2).RegionServer全部memstore达到规定值
   hbase.regionserver.global.memstore.size.lower.limit是0.95，
   hbase.regionserver.global.memstore.size是0.4，
   堆内存总共是 16G，
   触发刷写的阈值是：6.08GB
   触发阻塞的阈值是：6.4GB
   
   Compact合并机制
   在hbase中主要存在两种类型的compac合并
   1).minor compact 小合并
   (1).在将Store中多个HFile(StoreFile)合并为一个HFile
   这个过程中，删除和更新的数据仅仅只是做了标记，并没有物理移除，这种合并的触发频率
很高。
   (2).minor compact文件选择标准由以下几个参数共同决定：
   <!--待合并文件数据必须大于等于下面这个值-->
   <property>
       <name>hbase.hstore.compaction.min</name>
   <value>3</value>
   </property>
   <!--待合并文件数据必须小于等于下面这个值-->
   <property>
       <name>hbase.hstore.compaction.max</name>
   <value>10</value>
   </property>
   <!-- 默认值为128m,表示文件大小小于该值的store file 一定会加入到minor compaction的store file中-->
   <property>
       <name>hbase.hstore.compaction.min.size</name>
       <value>134217728</value>
   </property>
   <!--默认值为LONG.MAX_VALUE，表示文件大小大于该值的store file 一定会被minor compaction排除-->
   <property>
       <name>hbase.hstore.compaction.max.size</name>
       <value>9223372036854775807</value>
   </property>
   (3).触发条件
   memstore flush
       在进行memstore flush前后都会进行判断是否触发compact
   定期检查线程
       周期性检查是否需要进行compaction操作,由参数：
       hbase.server.thread.wakefrequency决定，默认值是10000 millseconds 
   2).major compact 大合并
   (1).合并Store中所有的HFile为一个HFile
    这个过程有删除标记的数据会被真正移除，同时超过单元格maxVersion的版本记录
也会被删除。合并频率比较低，默认7天执行一次，并且性能消耗非常大，建议生产关
闭(设置为0)，在应用空闲时间手动触发。一般可以是手动控制进行合并，防止出现在业
务高峰期。
   major compaction触发时间条件
   <!--默认值为7天进行一次大合并，-->
   <property>
       <name>hbase.hregion.majorcompaction</name>
       <value>604800000</value>
   </property> 
   手动触发
   ##使用major_compact命令
   major_compact tableName   